<?php
/** api函数库
 *  注意，如需要更改该文件路径，需到thinkphp/start.php 修改路径
 */

/*2017-4-10 15.45 jack*/
/** 设置获取网站配置
 * @param string $index 获取配置索引
 * @return mix
 */
function shop_config($index = "")
{
    static $cache_config;
    if(empty($cache_config))
    {
        $cache_config = cache('CONFIG');
    }
    if(empty($cache_config))
    {
        $shop = new \app\api\model\SellerShop();
        $cache_config = $shop->shop_config();
        cache('CONFIG',$cache_config);
    }
    if(!empty($index) && isset($cache_config[$index]))
    {
        return $cache_config[$index];
    }
    return $cache_config;
}


/*2017-4-10 15.45 jack*/
/** 根据子父关系，构造一个数组，只支持二级
 * @param $data 一个包含子父数据的数组
 * @param string [$key] 主键字段 id(可选)
 * @param string [$parent_key] 父字段 parent_id(可选)
 * @param string [$return_child_key] 返回的子类字段名(可选)
 * @return array
 */
function set_two_three($data,$key='id',$parent_key='parent_id',$return_child_key='child')
{

    $new_data = $data = to_array($data) ;
    $new_new = array();
    $i = 0;
    if(!empty($data))
    {
        foreach($new_data as $k=>$v)
        {
            if(!isset($v[$parent_key]))
            {
                continue;
            }
            //判断是父
            if($v[$parent_key] == 0)
            {

                $new_new[$i] = $v;
                foreach($data as $k1=>$v1)
                {
                    if(!isset($v1[$parent_key]) || !isset($v[$key]))
                    {
                        continue;
                    }
                    //从父找子
                    if($v1[$parent_key] == $v[$key])
                    {
                        $new_new[$i][$return_child_key][] = $v1;
                    }
                }
                ++$i;
            }
            else
            {
                unset($new_data[$k]);
            }
        }
    }
    return $new_new;

}

/*2017-4-10 15.45 jack*/
/** 对象转义数组
 * @param $object
 * @return array
 */
function to_array($object)
{
    return json_decode(json_encode($object,JSON_UNESCAPED_UNICODE),true);
}


/*2017-4-10 15.45 jack*/
/** 转移成json
 * @param $data
 * @return array
 */
function to_json($data)
{
    return json_encode($data,JSON_UNESCAPED_UNICODE);
}


/*2017-4-10 15.45 jack*/
/** 根据两个数组的字段，进行关联
 * @param $array 数组一
 * @param $array1 被包含数组二
 * @param $field 数组一关联的键
 * @param $field1 数组二关联的键
 * @param string $new_field 数组一包含数组二的键值(可选)
 * @param int  $data_limit 数据数量限制 (可选)
 * @return array 返回一个，数组一包含数组二的数组
 */
function link_array($array,$array1,$field,$field1,$new_field = 'data_list',$data_limit = 0)
{
    if(!empty($array) && !empty($array1))
    {
        foreach($array as $k=>$v)
        {
            foreach($array1 as $k1=>$v1)
            {
                if(!isset($v[$field]) || !isset($v1[$field1]))
                {
                    continue;
                }
                if($v[$field] == $v1[$field1])
                {
                    //如果超出了定义的数量限制，则直接跳开循环
                    if($data_limit > 0 && isset($array[$k][$new_field]) && count($array[$k][$new_field]) >= $data_limit)
                    {
                        break;
                    }
                    $array[$k][$new_field][] = $v1;
                }
            }
        }
    }
    return $array;
}


/*2017-4-10 15.45 jack*/
/** 合并数组的某字段值，并用符号连接,返回一个字符串
 * @param $data 数组
 * @param $field 键
 * @param string $symbol 要连接的符号
 * @return string
 */
function sym_combine_array($data,$field,$symbol = ',')
{
    static $string = "";
    if(!empty($data) && is_array($data))
    {
        foreach($data as $k=>$v)
        {
            if(is_array($v))
            {
                sym_combine_array($v,$field,$symbol);
            }
            else
            {
                if($k == $field)
                {
                    $string .= $symbol.$v;
                }
            }
        }
    }
    return trim($string,",");
}

/*2017-4-10 15.45 jack*/
/** 转换绝对路径url，该配置在config|HOME.IMG_URL
 * @param $url
 * @return string
 */
function ab_url($url)
{
    //该路径不空 并且(该路径不是绝对路径)
    if(!empty($url) && (strpos($url,"http://") === false && strpos($url,"https://") === false ))
    {
        $url = config('HOME.IMG_URL').trim($url,"/");
    }
    return $url;
}
/*2017-4-10 15.45 jack*/
/** 转换绝对路径url，该配置在config|HOME.IMG_URL
 * @param $url
 * @return string
 */
function local_ab_url($url)
{
    //该路径不空 并且(该路径不是绝对路径)
    if(!empty($url) && (strpos($url,"http://") === false && strpos($url,"https://") === false ))
    {
        $url = $_SERVER['REQUEST_SCHEME']."://".$_SERVER['SERVER_NAME']."/".config('HOME.base_path').trim($url,"/");
    }
    return $url;
}

/*2017-4-10 15.45 jack*/
/** 阶梯查找(注意：该数值必须得从低到高排序)
 * @param $arr 要查找的数组
 * @param $number 当前要查找的数量值
 * @param $find_field 需要比较的键
 * @param $target_field 获取值的键
 * @return string 返回最终查找到的阶梯，如果找不到，返回空
 */
function search_stair($arr,$number,$find_field,$target_field)
{
    $str = "";
    if(count($arr) > 0)
    {
        foreach($arr as $k=>$v)
        {
            //如果该数值等于当前数组的数值 或者
            // (当前是最后一个并且数值大于当前数组的数值) 或者
            // (当前不是最后一个并且该数值大于当前数组的值并且该数值小于下一个数组的数值)
            if(isset($v[$find_field]) && $number == $v[$find_field]
                || ($number > $v[$find_field] && !isset($arr[$k+1]))
                || ( isset($arr[$k+1]) && $number > $v[$find_field] && $number <  $arr[$k+1][$find_field])
            )
            {
                //获取当前最终查找的键值
                $str =  $v[$target_field];
                //直接跳出循环
                break;
            }
        }
    }
    return $str;
}


/**
 * 获得当前格林威治时间的时间戳
 *
 * @return  integer
 */
function gmtime()
{
    return (time() - date('Z'));
}

/**
 *  生成一个用户自定义时区日期的GMT时间戳
 *
 * @access  public
 * @param   int     $hour
 * @param   int     $minute
 * @param   int     $second
 * @param   int     $month
 * @param   int     $day
 * @param   int     $year
 *
 * @return void
 */
function local_mktime($hour = NULL , $minute= NULL, $second = NULL,  $month = NULL,  $day = NULL,  $year = NULL)
{
    $timezone = config('TIME_ZONE');

    /**
     * $time = mktime($hour, $minute, $second, $month, $day, $year) - date('Z') + (date('Z') - $timezone * 3600)
     * 先用mktime生成时间戳，再减去date('Z')转换为GMT时间，然后修正为用户自定义时间。以下是化简后结果
     **/
    $time = mktime($hour, $minute, $second, $month, $day, $year) - $timezone * 3600;

    return $time;
}

/**
 * 将GMT时间戳格式化为用户自定义时区日期
 *
 * @param  string       $format
 * @param  integer      $time       该参数必须是一个GMT的时间戳
 *
 * @return  string
 */

function local_date($format, $time = NULL)
{
    $timezone = config('TIME_ZONE');

    if ($time === NULL)
    {
        $time = gmtime();
    }
    elseif ($time <= 0)
    {
        return '';
    }

    $time += ($timezone * 3600);

    return date($format, $time);
}

/**
 * 转换字符串形式的时间表达式为GMT时间戳
 *
 * @param   string  $str
 *
 * @return  integer
 */
function gmstr2time($str)
{
    $time = strtotime($str);

    if ($time > 0)
    {
        $time -= date('Z');
    }

    return $time;
}

/**
 *  将一个用户自定义时区的日期转为GMT时间戳
 *
 * @access  public
 * @param   string      $str
 *
 * @return  integer
 */
function local_strtotime($str)
{
    $timezone = config('TIME_ZONE');

    /**
     * $time = mktime($hour, $minute, $second, $month, $day, $year) - date('Z') + (date('Z') - $timezone * 3600)
     * 先用mktime生成时间戳，再减去date('Z')转换为GMT时间，然后修正为用户自定义时间。以下是化简后结果
     **/
    $time = strtotime($str) - $timezone * 3600;

    return $time;

}

/**
 * 获得用户所在时区指定的时间戳
 *
 * @param   $timestamp  integer     该时间戳必须是一个服务器本地的时间戳
 *
 * @return  array
 */
function local_gettime($timestamp = NULL)
{
    $tmp = local_getdate($timestamp);
    return $tmp[0];
}

/**
 * 获得用户所在时区指定的日期和时间信息
 *
 * @param   $timestamp  integer     该时间戳必须是一个服务器本地的时间戳
 *
 * @return  array
 */
function local_getdate($timestamp = NULL)
{
    $timezone = config('TIME_ZONE');

    /* 如果时间戳为空，则获得服务器的当前时间 */
    if ($timestamp === NULL)
    {
        $timestamp = time();
    }

    $gmt        = $timestamp - date('Z');       // 得到该时间的格林威治时间
    $local_time = $gmt + ($timezone * 3600);    // 转换为用户所在时区的时间戳

    return getdate($local_time);
}

/** 删除数组不包含定义的键
 * @param $data
 * @param $exists_key_arr
 * @return array
 */
function unset_not_exists_key($data,$exists_key_arr)
{
    if(!empty($data))
    {
        foreach($data as $k=>$v)
        {
            if(!in_array($k,$exists_key_arr))
            {
                unset($data[$k]);
            }
        }
    }
    return $data;
}

/**获取一个新订单号
 * @return string
 */
function get_order_sn()
{
    /* 选择一个随机的方案 */
    mt_srand((double) microtime() * 1000000);

    return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

/**
 * 读取文件内容
 * @param string $path
 * @return string
 */

function file_read($path)
{
    //文件不存在
    if(!file_exists($path))
    {
        return "";
    }

    return file_get_contents($path);
}

/**写入文件内容
 * @param string $path 路径
 * @param string $content 内容
 * @return false
 */
function file_write($path,$content)
{
    $path = str_replace("\\","/",$path);
    $path = explode("/",$path);
    $file_path = "";
    if(!empty($path))
    {
        foreach($path as $k=>$v)
        {
            $file_path.=$v."/";
            //如果不是文件后缀，
            if(strpos($v,".") === false )
            {
                //如果这不是个目录
                if(!is_dir($file_path))
                {
                    //生成新的目录
                    mkdir($file_path,0777);
                }
            }
        }
    }
    $path = implode("/",$path);

    //创建或者读取文件,把内容写到末尾
        $file = fopen($path,"a+");
        fwrite($file,$content);
        fclose($file);
        //读取文件内容并返回
        $content = file_read($path);
        return $content;
}

/** 生成随机数
 * @param int $length
 * @param int $numeric
 * @return string
 */
function random($length = 6 , $numeric = 0) {
    PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
    if($numeric) {
        $hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
    } else {
        $hash = '';
        $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';
        $max = strlen($chars) - 1;
        for($i = 0; $i < $length; $i++) {
            $hash .= $chars[mt_rand(0, $max)];
        }
    }
    return $hash;
}


/** 计算两个时间相差的秒数
 * @param $begin_time
 * @param $end_time
 * @return array
 */
    function timediff($begin_time,$end_time){
        if($begin_time < $end_time){
            $starttime = $begin_time;
            $endtime = $end_time;
        }else{
            $starttime = $end_time;
            $endtime = $begin_time;
        }

        //计算天数
        $timediff = $endtime-$starttime;
        $days = intval($timediff/86400);
        //计算小时数
        $remain = $timediff%86400;
        $hours = intval($remain/3600);
        //计算分钟数
        $remain = $remain%3600;
        $mins = intval($remain/60);
        //计算秒数
        $secs = $remain%60;
        $res = array("day" => $days,"hour" => $hours,"min" => $mins,"sec" => $secs);
        return $res;
    }

/** 密码函数
 * @param $cfg 包括password ec_salt
 * @return string
 */
function compile_password ($cfg)
{
    if (isset($cfg['password'])) {
        $cfg['md5password'] = md5($cfg['password']);
    }

    if (!empty($cfg['ec_salt'])) {
        return md5($cfg['md5password'] . $cfg['ec_salt']);
    } else {
        return $cfg['md5password'];
    }
}


/** 字符串裁剪
 * @param $str 要裁剪字符，如果字符串，请算两位长度/个
 * @param $length 裁剪长度
 * @param string $doc 裁剪后连接符号
 * @return string
 */
function string_cut($str,$length,$doc="..")
{
    return \plugin\filter::zh_cutstr($str,$length,$doc);
}

/**
 * 邮件发送函数
 * @param $to    要发送的email
 * @param $title 发送标题
 * @param $content 发送的内容
 * @return bool
 */
function sendMail($to, $title, $content)
{
    vendor('PHPMailer.PHPMailerAutoload');
    $mail = new \PHPMailer(); //实例化
    $mail->IsSMTP(); // 启用SMTP
    $mail->Host     = config('MAIL_HOST'); //smtp服务器的名称（这里以163邮箱为例）
    $mail->Port     = config('MAIL_PORT'); //smtp服务器的端口（这里以163邮箱为例）
    $mail->SMTPAuth = config('MAIL_SMTPAUTH'); //启用smtp认证
    $mail->Username = config('MAIL_USERNAME'); //你的邮箱名
    $mail->Password = config('MAIL_PASSWORD'); //邮箱密码
    $mail->From     = config('MAIL_FROM'); //发件人地址（也就是你的邮箱地址）
    $mail->FromName = config('MAIL_FROMNAME'); //发件人姓名
    $mail->AddAddress($to, "尊敬的客户");
    $mail->WordWrap = 50; //设置每行字符长度
    $mail->IsHTML(config('MAIL_ISHTML')); // 是否HTML格式邮件
    $mail->CharSet  = config('MAIL_CHARSET'); //设置邮件编码
    $mail->Subject  = $title; //邮件主题
    $mail->Body     = $content; //邮件内容
    $mail->AltBody  = "这是一个纯文本的身体在非营利的HTML电子邮件客户端"; //邮件正文不支持HTML的备用显示
    $mail->Send();
    die($mail->ErrorInfo);
}

//随机字符串
function randString($length)
{
// 密码字符集，可任意添加你需要的字符
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $password = "";
    for ( $i = 0; $i < $length; $i++ )
    {
        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    }
    return $password;
}